/**
 * 文件名：@DateUtil.java <br/>
 * 包名：cn.efunbox.afw.core.util <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.util;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 类名：DateUtil  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月4日 下午4:44:11  <br />
 * @version 2015年12月4日
 */
public class DateUtil {

	// 缓存
	private static final Map<String, SimpleDateFormat> formats;
	
	static {
		formats = new HashMap<String, SimpleDateFormat>();
		
		formats.put("yyyyMMdd", new SimpleDateFormat("yyyyMMdd"));
		formats.put("HHmmss", new SimpleDateFormat("HHmmss"));
		formats.put("yyyyMMddHHmmss", new SimpleDateFormat("yyyyMMddHHmmss"));
		formats.put("yyyyMMddHHmmssSSS", new SimpleDateFormat("yyyyMMddHHmmssSSS"));
	}
	
	/**
	 * 
	 * 功能：比较两个日期的顺序 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-12-28 上午11:20:58 <br/>
	 */
	public static int compare(Date one, Date two) {
		return one.compareTo(two);
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-12-4 下午02:06:59 <br/>
	 */
	public static Date add(Date date, int field, int amount) {
		return add(date, field, amount, null);
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-12-4 下午02:06:19 <br/>
	 */
	public static Date add(Date date, int field, int amount, TimeZone timeZone) {
		Calendar cal = (timeZone == null ? Calendar.getInstance() : Calendar.getInstance(timeZone));
		
		cal.setTime(date);
		
		cal.add(field, amount);
		
		return cal.getTime();
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-27 上午10:01:13 <br/>
	 */
	public static Date parseDateTime(String source) throws ParseException {
		return parse(source, "yyyyMMddHHmmss");
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-27 上午10:01:28 <br/>
	 */
	public static Date parseTime(String source) throws ParseException {
		return parse(source, "HHmmss");
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-27 上午10:00:50 <br/>
	 * @throws ParseException 
	 */
	public static Date parseDate(String source) throws ParseException {
		return parse(source, "yyyyMMdd");
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-27 上午10:00:17 <br/>
	 */
	public static Date parse(String source, String pattern) throws ParseException {
		return getFormat(pattern).parse(source);
	}

	/**
	 *
	 * 功能：获取获取毫秒值得时间戳 + 0-9 随机数一位 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:58:17 <br/>
	 */
	public static String getRandomCurrentTimeStamp() {
		return formaCurrentTimeStamp(new Date())+ new Random().nextInt(9);
	}
	/**
	 *
	 * 功能：获取秒值得时间戳 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:58:17 <br/>
	 */
	public static String getTimeStamp() {
		return formatDateTime(new Date());
	}
	/**
	 *
	 * 功能： 获取毫秒值得时间戳 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:58:17 <br/>
	 */
	public static String getCurrentTimeStamp() {
		return formaCurrentTimeStamp(new Date());
	}
	/**
	 *
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:58:17 <br/>
	 */
	public static String formaCurrentTimeStamp(Date date) {
		return format(date, "yyyyMMddHHmmssSSS");
	}
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:58:17 <br/>
	 */
	public static String formatDateTime(Date date) {
		return format(date, "yyyyMMddHHmmss");
	}
	
	/**
	 * 
	 * 功能：按默认规则格式化为时间 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:57:33 <br/>
	 */
	public static String formatTime(Date date) {
		return format(date, "HHmmss");
	}
	
	/**
	 * 
	 * 功能：按默认规则格式化日期 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:56:47 <br/>
	 */
	public static String formatDate(Date date) {
		return format(date, "yyyyMMdd");
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-26 下午07:55:49 <br/>
	 */
	public static String format(Date date, String pattern) {
		return getFormat(pattern).format(date);
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2013-11-27 上午09:59:37 <br/>
	 */
	private static SimpleDateFormat getFormat(String pattern) {
		SimpleDateFormat sdf = formats.get(pattern);
		
		if (null == sdf) {
			formats.put(pattern, sdf = new SimpleDateFormat(pattern));
		}
		
		// 强制格式匹配
		sdf.setLenient(false);
		
		return sdf;
	}

	/**
	 * 将短时间格式时间转换为字符串 yyyy-MM-dd
	 *
	 * @param dateDate
	 * @return
	 */
	public static String dateToStr(Date dateDate) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		String dateString = formatter.format(dateDate);
		return dateString;
	}

	/**
	 * 将短时间格式字符串转换为时间 yyyy-MM-dd
	 *
	 * @param strDate
	 * @return
	 */
	public static Date strToDate(String strDate) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		ParsePosition pos = new ParsePosition(0);
		Date strtodate = formatter.parse(strDate, pos);
		return strtodate;
	}

	public static void main(String[] args) {
		for (int i = 0; i < 20; i++) {
			System.out.println(DateUtil.getRandomCurrentTimeStamp());
		}
	}
}
